import { alovaInstance } from '@/api'
import { getApiUrl } from '@/utils/http'

// 登录参数
export interface LoginParams {
  username: string
  password: string
  tenantName?: string
  tenantId?: number | string
  captchaVerification?: string
  rememberMe?: boolean
}

// 管理员信息
export interface AdminInfo {
  id: number
  username: string
  nickname: string
  avatar?: string
  email?: string
  mobile?: string
  deptId?: number
  deptName?: string
  postIds?: number[]
  postNames?: string[]
  roleIds?: number[]
  roleNames?: string[]
  status: number // 0-禁用 1-正常
  loginIp?: string
  loginTime?: string
  createTime: string
}

// 登录响应
export interface LoginResponse {
  userId: number
  accessToken: string
  refreshToken: string
  expiresTime: string
  tenantId?: number | string
  openid?: string // 社交登录时返回的 openid
}

// 管理员登录
export function adminLogin(data: LoginParams) {
  return alovaInstance.Post<LoginResponse>(getApiUrl('/system/auth/login'), data)
}

// 获取管理员信息
export function getAdminInfo() {
  return alovaInstance.Get<AdminInfo>(getApiUrl('/system/auth/get-permission-info'))
}

// 更新管理员信息参数
export interface AdminInfoUpdateParams {
  nickname?: string
  avatar?: string
  email?: string
  mobile?: string
}

// 更新管理员信息
export function updateAdminInfo(data: AdminInfoUpdateParams) {
  return alovaInstance.Put<AdminInfo>(getApiUrl('/system/user/update'), data)
}

// 退出登录
export function logout() {
  return alovaInstance.Post(getApiUrl('/system/auth/logout'))
}

// 刷新Token
export function refreshToken(refreshToken: string) {
  return alovaInstance.Post<LoginResponse>(getApiUrl(`/system/auth/refresh-token?refreshToken=${refreshToken}`))
}

// 修改密码参数
export interface ChangePasswordParams {
  oldPassword: string
  newPassword: string
}

// 修改密码
export function changePassword(data: ChangePasswordParams) {
  return alovaInstance.Put(getApiUrl('/system/user/update-password'), data)
}

// 使用租户名，获得租户编号
export function getTenantIdByName(name: string) {
  return alovaInstance.Get<number>(getApiUrl('/system/tenant/get-id-by-name'), {
    params: { name },
  })
}

// 获取验证码
export function getCaptcha() {
  return alovaInstance.Get<{ captchaId: string, captchaImage: string }>(getApiUrl('/system/auth/captcha'))
}

// 验证验证码
export function verifyCaptcha(captchaId: string, captchaCode: string) {
  return alovaInstance.Post(getApiUrl('/system/auth/verify-captcha'), {
    captchaId,
    captchaCode,
  })
}

// 社交登录参数
export interface SocialLoginParams {
  type: number // 社交平台类型，参见 UserSocialTypeEnum 枚举值
  code: string // 授权码
  state: string // state
}

// 社交快捷登录，使用 code 授权码
export function socialLogin(data: SocialLoginParams) {
  return alovaInstance.Post<LoginResponse>(getApiUrl('/system/auth/social-login'), data)
}

// 社交账号绑定参数
export interface SocialBindParams {
  type: number // 社交平台类型
  code: string // 授权码
  state: string // state
  username: string // 用户名
  password: string // 密码
}

// 绑定社交账号
export function bindSocialAccount(data: SocialBindParams) {
  return alovaInstance.Post<LoginResponse>(getApiUrl('/system/auth/social-bind'), data)
}

// 微信小程序登录参数
export interface WeixinMiniAppLoginParams {
  phoneCode: string // 手机 code，小程序通过 wx.getPhoneNumber 方法获得
  loginCode: string // 登录 code，小程序通过 wx.login 方法获得
  state: string // state
}

// 微信小程序一键登录
export function weixinMiniAppLogin(data: WeixinMiniAppLoginParams) {
  return alovaInstance.Post<LoginResponse>(getApiUrl('/system/auth/weixin-mini-app-login'), data)
}
